package com.kuang.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 如果创建线程池？
 *      线程池不允许使用Executors直接创建，需要通过ThreadPoolExecutor创建，避免资源耗尽；
 *          原因1：固定线程池(FixedThreadPool)和单例线程池(SingleThreadPool)允许的 请求队列 长度为Integer.MAX_VALU,约21亿，可能会堆积大量请求，导致OOM内存溢出
 *          原因2：可变线程池(CachedThreadPool)和调度线程池(ScheduledThreadPool)允许的 创建线程数量 为Integer.MAX_VALUE，可能会创建大量线程，导致OOM
 *      Executors 工具类，3大方法
 *      1.Executors.newSingleThreadExecutor(); //单个线城池
 *      2.Executors.newFixedThreadPool(5);     //固定的线程池大小
 *      3.Executors.newCachedThreadPool();     //可伸缩的
 */
public class Demo01 {
    public static void main(String[] args) {
        // 1.单个线城池
        ExecutorService singleThread = Executors.newSingleThreadExecutor();
        // 2.创建一个固定的线程池大小
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        // 3.可伸缩的，遇强则强，遇弱则弱
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();


        // 1.单线程池；创建100个线程
        //try{
        //    for (int i = 1; i < 100; i++) {
        //        singleThread.execute(()->{
        //            System.out.println(Thread.currentThread().getName() + ":ok");
        //        });
        //    }
        //}catch (Exception e){
        //    e.printStackTrace();
        //}finally {
        //    // 线程池用完，程序结束，关闭线程池
        //    singleThread.shutdown();
        //}
        /*
            ...
            pool-1-thread-1:ok   使用的都是线程池1中的线程1
            pool-1-thread-1:ok
            pool-1-thread-1:ok
            ...
         */


        // 2.固定的线程池；创建100个线程
        //try{
        //    for (int i = 1; i < 100; i++) {
        //        fixedThreadPool.execute(()->{
        //            System.out.println(Thread.currentThread().getName() + ":ok");
        //        });
        //    }
        //}catch (Exception e){
        //    e.printStackTrace();
        //}finally {
        //    // 线程池用完，程序结束，关闭线程池
        //    singleThread.shutdown();
        //}
        /*
            ...
            pool-2-thread-2:ok   使用线程池2中的线程，最大5
            pool-2-thread-5:ok
            pool-2-thread-4:ok
            pool-2-thread-1:ok
            pool-2-thread-3:ok
            pool-2-thread-1:ok
            pool-2-thread-4:ok
            pool-2-thread-2:ok
            pool-2-thread-5:ok
            ...
         */


        // 3.可伸缩的线程池；创建100个线程
        try{
            for (int i = 1; i < 100; i++) {
                cachedThreadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName() + ":ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 线程池用完，程序结束，关闭线程池
            singleThread.shutdown();
        }
        /*
            ...
            pool-3-thread-12:ok  使用线程池3中的线程
            pool-3-thread-16:ok
            pool-3-thread-18:ok
            pool-3-thread-16:ok
            pool-3-thread-8:ok
            pool-3-thread-14:ok
            pool-3-thread-9:ok
            pool-3-thread-8:ok
            pool-3-thread-11:ok
            ...
         */
    }


}
